home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / indent / args.c < prev    next >
C/C++ Source or Header  |  1989-04-06  |  7KB  |  266 lines

  1. /*
  2.  * Copyright (c) 1980 Regents of the University of California.
  3.  * Copyright (c) 1976 Board of Trustees of the University of Illinois.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms are permitted
  7.  * provided that this notice is preserved and that due credit is given
  8.  * to the University of California at Berkeley and the University of
  9.  * Illinois at Urbana.  The name of either University may not be used
  10.  * to endorse or promote products derived from this software without
  11.  * specific prior written permission. This software is provided
  12.  * ``as is'' without express or implied warranty.
  13.  */
  14.  
  15. #ifndef lint
  16. static char sccsid[] = "@(#)args.c    5.3 (Berkeley) 3/22/88";
  17. #endif /* not lint */
  18.  
  19. /*
  20.  * Argument scanning and profile reading code.  Default parameters
  21.  * are set here as well.
  22.  */
  23.  
  24. #include "indent_globs.h"
  25. #include <sys/types.h>
  26. #include <ctype.h>
  27.  
  28. char *getenv(), *index();
  29.  
  30. /* profile types */
  31. #define    PRO_SPECIAL    1    /* special case */
  32. #define    PRO_BOOL    2    /* boolean */
  33. #define    PRO_INT        3    /* integer */
  34.  
  35. /* profile specials for booleans */
  36. #define    ON        1    /* turn it on */
  37. #define    OFF        0    /* turn it off */
  38.  
  39. /* profile specials for specials */
  40. #define    IGN        1    /* ignore it */
  41. #define    CLI        2    /* case label indent (float) */
  42. #define    STDIN        3    /* use stdin */
  43. #define    KEY        4    /* type (keyword) */
  44.  
  45. /*
  46.  * N.B.: because of the way the table here is scanned, options
  47.  * whose names are substrings of other options must occur later;
  48.  * that is, with -lp vs -l, -lp must be first.  Also, while (most)
  49.  * booleans occur more than once, the last default value is the
  50.  * one actually assigned.
  51.  */
  52. struct pro {
  53.     char *p_name;        /* name, eg -bl, -cli */
  54.     int   p_type;        /* type (int, bool, special) */
  55.     int   p_default;        /* the default value (if int) */
  56.     int   p_special;        /* depends on type */
  57.     int  *p_obj;        /* the associated variable */
  58. } pro[] = {
  59.     "npro",    PRO_SPECIAL,    0,    IGN,    0,
  60.     "lc",    PRO_INT,    0,    0,    &block_comment_max_col,
  61.     "lp",    PRO_BOOL,    true,    ON,    &lineup_to_parens,
  62.     "nlp",    PRO_BOOL,    true,    OFF,    &lineup_to_parens,
  63.     "l",    PRO_INT,    78,    0,    &max_col,
  64.     "psl",    PRO_BOOL,    true,    ON,    &procnames_start_line,
  65.     "npsl",    PRO_BOOL,    true,    OFF,    &procnames_start_line,
  66.     "fc1",    PRO_BOOL,    true,    ON,    &format_col1_comments,
  67.     "nfc1",    PRO_BOOL,    true,    OFF,    &format_col1_comments,
  68.     "pcs",    PRO_BOOL,    false,    ON,    &proc_calls_space,
  69.     "npcs",    PRO_BOOL,    false,    OFF,    &proc_calls_space,
  70.     "ip",    PRO_BOOL,    true,    ON,    &ps.indent_parameters,
  71.     "nip",    PRO_BOOL,    true,    OFF,    &ps.indent_parameters,
  72.  /* see set_defaults for initialization of -cli */
  73.     "cli",    PRO_SPECIAL,    0,    CLI,    0,
  74.     "ci",    PRO_INT,    0,    0,    &continuation_indent,
  75.     "cdb",    PRO_BOOL,    true,    ON,  &comment_delimiter_on_blankline,
  76.     "ncdb",    PRO_BOOL,    true,    OFF, &comment_delimiter_on_blankline,
  77.     "i",    PRO_INT,    8,    0,    &ps.ind_size,
  78.     "cd",    PRO_INT,    0,    0,    &ps.decl_com_ind,
  79.     "ce",    PRO_BOOL,    true,    ON,    &cuddle_else,
  80.     "nce",    PRO_BOOL,    true,    OFF,    &cuddle_else,
  81.     "c",    PRO_INT,    33,    0,    &ps.com_ind,
  82.     "v",    PRO_BOOL,    false,    ON,    &verbose,
  83.     "nv",    PRO_BOOL,    false,    OFF,    &verbose,
  84.     "dj",    PRO_BOOL,    false,    ON,    &ps.ljust_decl,
  85.     "ndj",    PRO_BOOL,    false,    OFF,    &ps.ljust_decl,
  86.  /* don't ask *me* why -bc/-nbc is backwards.... */
  87.     "bc",    PRO_BOOL,    true,    OFF,    &ps.leave_comma,
  88.     "nbc",    PRO_BOOL,    true,    ON,    &ps.leave_comma,
  89.     "di",    PRO_INT,    16,    0,    &ps.decl_indent,
  90.     "d",    PRO_INT,    0,    0,    &ps.unindent_displace,
  91.     "br",    PRO_BOOL,    true,    ON,    &btype_2,
  92.     "bl",    PRO_BOOL,    true,    OFF,    &btype_2,
  93.     "st",    PRO_SPECIAL,    0,    STDIN,    0,
  94.     "ei",    PRO_BOOL,    true,    ON,    &ps.else_if,
  95.     "nei",    PRO_BOOL,    true,    OFF,    &ps.else_if,
  96.     "sc",    PRO_BOOL,    true,    ON,    &star_comment_cont,
  97.     "nsc",    PRO_BOOL,    true,    OFF,    &star_comment_cont,
  98.     "bap",    PRO_BOOL,    false,    ON,    &blanklines_after_procs,
  99.     "nbap",    PRO_BOOL,    false,    OFF,    &blanklines_after_procs,
  100.     "sob",    PRO_BOOL,    false,    ON,    &swallow_optional_blanklines,
  101.     "nsob",    PRO_BOOL,    false,    OFF,    &swallow_optional_blanklines,
  102.     "bad",    PRO_BOOL,    false,    ON,  &blanklines_after_declarations,
  103.     "nbad",    PRO_BOOL,    false,    OFF, &blanklines_after_declarations,
  104.     "bbb",    PRO_BOOL,    false,    ON,  &blanklines_before_blockcomments,
  105.     "nbbb",    PRO_BOOL,    false,    OFF, &blanklines_before_blockcomments,
  106.     "ps",    PRO_BOOL,    false,    ON,    &pointer_as_binop,
  107.     "nps",    PRO_BOOL,    false,    OFF,    &pointer_as_binop,
  108.     "troff",    PRO_BOOL,    false,    ON,    &troff,
  109.     "T",    PRO_SPECIAL,    0,    KEY,    0,
  110.  /* whew! */
  111.     0,        0,        0,    0,    0
  112. };
  113.  
  114. /*
  115.  * set_profile reads $HOME/.indent.pro and ./.indent.pro and
  116.  * handles arguments given in these files.
  117.  */
  118. set_profile()
  119. {
  120.     register FILE *f;
  121.     char fname[BUFSIZ];
  122.     static char pro[] = ".indent.pro";
  123.  
  124.     sprintf(fname, "%s/%s", getenv("HOME"), pro);
  125.     if ((f = fopen(fname, "r")) != NULL) {
  126.     scan_profile(f);
  127.     (void) fclose(f);
  128.     }
  129.     if ((f = fopen(pro, "r")) != NULL) {
  130.     scan_profile(f);
  131.     (void) fclose(f);
  132.     }
  133. }
  134.  
  135. scan_profile(f)
  136.     register FILE *f;
  137. {
  138.     register char *p, *arg;
  139.     char buf[BUFSIZ];
  140.  
  141.     while (fgets(buf, sizeof buf, f)) {
  142.     if ((p = index(buf, '\n')) != NULL)
  143.         *p = 0;
  144.     if (verbose)
  145.         printf("profile: %s\n", buf);
  146.     p = buf;
  147.     for (;;) {
  148.         while (isspace(*p))
  149.         p++;
  150.         if (*p == 0)
  151.         break;
  152.         arg = p;
  153.         while (*p) {
  154.         if (isspace(*p)) {
  155.             *p++ = 0;
  156.             break;
  157.         }
  158.         p++;
  159.         }
  160.         set_option(arg);
  161.     }
  162.     }
  163. }
  164.  
  165. char       *param_start;
  166.  
  167. eqin(s1, s2)
  168.     register char *s1;
  169.     register char *s2;
  170. {
  171.     while (*s1) {
  172.     if (*s1++ != *s2++)
  173.         return (false);
  174.     }
  175.     param_start = s2;
  176.     return (true);
  177. }
  178.  
  179. /*
  180.  * Set the defaults.
  181.  */
  182. set_defaults()
  183. {
  184.     register struct pro *p;
  185.  
  186.     /*
  187.      * Because ps.case_indent is a float, we can't initialize it
  188.      * from the table:
  189.      */
  190.     ps.case_indent = 0.0;    /* -cli0.0 */
  191.     for (p = pro; p->p_name; p++)
  192.     if (p->p_type != PRO_SPECIAL)
  193.         *p->p_obj = p->p_default;
  194. }
  195.  
  196. set_option(arg)
  197.     register char *arg;
  198. {
  199.     register struct pro *p;
  200.     extern double atof();
  201.  
  202.     arg++;            /* ignore leading "-" */
  203.     for (p = pro; p->p_name; p++)
  204.     if (*p->p_name == *arg && eqin(p->p_name, arg))
  205.         goto found;
  206.     fprintf(stderr, "indent: unknown parameter \"%s\"\n", arg - 1);
  207.     exit(1);
  208. found:
  209.     switch (p->p_type) {
  210.  
  211.     case PRO_SPECIAL:
  212.         switch (p->p_special) {
  213.  
  214.         case IGN:
  215.             break;
  216.  
  217.         case CLI:
  218.             if (*param_start == 0)
  219.             goto need_param;
  220.             ps.case_indent = atof(param_start);
  221.             break;
  222.  
  223.         case STDIN:
  224.             if (input == 0)
  225.             input = stdin;
  226.             if (output == 0)
  227.             output = stdout;
  228.             break;
  229.  
  230.         case KEY:
  231.             if (*param_start == 0)
  232.             goto need_param;
  233.             addkey(param_start, 4);
  234.             break;
  235.  
  236.         default:
  237.             fprintf(stderr, "\
  238. indent: set_option: internal error: p_special %d\n", p->p_special);
  239.             exit(1);
  240.         }
  241.         break;
  242.  
  243.     case PRO_BOOL:
  244.         if (p->p_special == OFF)
  245.         *p->p_obj = false;
  246.         else
  247.         *p->p_obj = true;
  248.         break;
  249.  
  250.     case PRO_INT:
  251.         if (*param_start == 0) {
  252. need_param:
  253.         fprintf(stderr, "indent: ``%s'' requires a parameter\n",
  254.             arg - 1);
  255.         exit(1);
  256.         }
  257.         *p->p_obj = atoi(param_start);
  258.         break;
  259.  
  260.     default:
  261.         fprintf(stderr, "indent: set_option: internal error: p_type %d\n",
  262.             p->p_type);
  263.         exit(1);
  264.     }
  265. }
  266.